package LeetCode.题库.中等;

import LeetCode._01算法入门.day10递归回溯.ListNode;
import org.junit.Test;
import utils.MyPrintUtil;

/**
 * @author 挚爱之夕
 * @date 2022-03-07 - 03 - 07 - 15:32
 * @Description 给你两个非空 的链表，表示两个非负的整数。
 * 它们每位数字都是按照逆序的方式存储的，并且每个节点只能存储一位数字。
 * 请你将两个数相加，并以相同形式返回一个表示和的链表。
 * 你可以假设除了数字 0 之外，这两个数都不会以 0 开头。
 * @Version 中等
 */
public class _2两数相加 {
    static ListNode l1; //2->4->3
    static ListNode l2; //5->6->4
    static {
        l1 = new ListNode(2);
        l1.next = new ListNode(4);
        l1.next.next = new ListNode(3);

        l2 = new ListNode(5);
        l2.next = new ListNode(6);
        l2.next.next = new ListNode(4);

    }
    @Test
    public void solve(){
        ListNode res = addTwoNumbers(l1, l2);
        MyPrintUtil.printSingleLinkedList(res);//7->0->8
    }
    /*by me*/
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        int sum = l1.val + l2.val;
        int bit;
        if(sum >= 10){
            bit = 1;
            sum -= 10;
        }else{
            bit = 0;
        }
        ListNode head = new ListNode(sum);
        l1 = l1.next;
        l2 = l2.next;
        ListNode p = head;
        //遍历完连个链表的每一位
        while(l1 != null || l2 != null){
            //为空可视此位为0
            sum = (l1 != null ? l1.val : 0) + (l2 != null ? l2.val : 0) + bit;
            if(sum >= 10){
                bit = 1;
                sum -= 10;
            }else{
                bit = 0;
            }
            p.next = new ListNode(sum);
            p = p.next;
            l1 = (l1 == null ? null : l1.next);
            l2 = (l2 == null ? null : l2.next);
        }
        //如果还有进位
        if(bit == 1){
            p.next = new ListNode(1);
        }

        return head;
    }
}
